import time, os
from machine import SPI, Pin
import lib.st7735_buf as st7735_buf
from lib.easydisplay import EasyDisplay
from lib.sdcard import SDCard

# 初始化TFT的 CS 和 DC 引脚
tft_cs = Pin(5, Pin.OUT)
tft_dc = Pin(4, Pin.OUT)

# 初始化SD 卡的 CS 引脚
sd_cs = Pin(22, Pin.OUT)

# 确保初始状态是高电平，即未选中任何设备
tft_cs.value(1)
sd_cs.value(1)

# 初始化按键引脚
key_up = Pin(2,Pin.IN, Pin.PULL_UP)
key_down = Pin(13,Pin.IN, Pin.PULL_UP)

# 定义一个函数来切换 SPI 设备
def switch_spi_device(device):
    global spi2
    if device == 'tft':
        tft_cs.value(0)  # 选中 LCD
        sd_cs.value(1)   # 确保 SD 卡未选中
        # 重新初始化 SPI 对象以适用于 LCD
        spi2=SPI(2, baudrate=40000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
    elif device == 'sdcard':
        sd_cs.value(0)  # 选中 SD 卡
        tft_cs.value(1)  # 确保 LCD 未选中
        # 重新初始化 SPI 对象以适用于 SD 卡
        spi2=SPI(2, baudrate=40000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))

# 初始化LCD屏幕
def init_lcd():
    switch_spi_device('tft')
    dp = st7735_buf.ST7735(width=160, height=128, spi=spi2, cs=tft_cs, dc=tft_dc, res=19, rotate=1, bl=None, invert=False, rgb=False)
    ed = EasyDisplay(dp, "RGB565", font="/font/text_lite_16px_2312.v3.bmf", show=True, color=0xFFFF, clear=True, auto_wrap=True)
    return ed, dp

# 初始化SD 卡
def init_sd():
    global sd
    switch_spi_device('sdcard')
    sd = SDCard(spi2, sd_cs)

# 定义一个消抖函数
def debounce(pin):
    state = pin.value()
    time.sleep(0.01)
    # 确定引脚状态是否与初始状态相同
    return state == pin.value()

def main():
    global i
    global j
    
    # 初始化LCD
    ed, dp = init_lcd()
     # 显示初始内容
    j = 0
    
    # 读取SD卡的TXT
    filename = '/data/book.txt'
    init_sd()
    os.mount(sd, '/sd')
    print("SD card mounted")
    # 检查文件是否存在
    try:
        # 打开文件
        with open(filename, 'r', encoding='utf-8') as file:
            # 读取文件内容
            content = file.read()
            file.close()
            # 将文件内容分割成每70个字符的字符串
            chunks = [content[i:i + 70] for i in range(0, len(content), 70)]
    except OSError as e:
        if e.args[0] == 2:  # 检查错误码是否为文件不存在
            print("文件不存在。")
        else:
            print("打开文件时发生错误：", e)
        ed.text("文件不存在或打开失败",0,0)
        return
   
    ed.text(chunks[j], 0, 0)
    
    while True :
        # 检查按键UP是否稳定地被按下
        if debounce(key_up) and key_up.value() == 0:
            # 如果按键UP被按下
            if not key_up.value():
                if j == 0:
                    ed.text('这是开头！', 0, 0)
                    ed.text(chunks[0], 0, 0)
                else:
                    j = j-1
                    ed.text(chunks[j], 0, 0)                    
                # 当按键没有被释放时，循环等待
                while not key_up.value():
                    pass
        # 检查按键DOWN是否稳定地被按下    
        elif debounce(key_down) and key_down.value() == 0:
            # 如果按键DOWN被按下
            if not key_down.value():
                if j == (len(chunks)-1):
                    ed.text('这是结尾！', 0, 0)
                    ed.text(chunks[j], 0, 0)
                else:
                    j = j+1
                    ed.text(chunks[j], 0, 0)
                # 当按键没有被释放时，循环等待
                while not key_down.value():
                    pass


if __name__ == "__main__":
    main()